package DiffMerge;

import javax.swing.JOptionPane;
import javax.swing.JTextPane;

import GUI.InterfacePrincipal;

/**
 * @author Brian Mazini Siervi ~> http:www.briansiervi.com
 */

public class BMS_Merge extends XMLMerge{
	public static int posicaoSubstring;
	
	
	public BMS_Merge(){}		    
    
    /**
     * Retorna o caminho do arquivo utilizado como base para o Merge de Arquivos
     * @return caminhoArquivoBase
     */
	public String getCaminhoArquivoBase() {
		return super.getCaminhoArquivoBase();
	}
	
	/**
     * Define o caminho do arquivo utilizado como base para o Merge de Arquivos 
     */
	public void setCaminhoArquivoBase() {
		this.caminhoArquivoBase = super.getCaminhoArquivoBase();
	}
	
	/**
     * Retorna o caminho do arquivo que não é utilizado como base para o Merge de Arquivos
     * @return caminhoArquivoDerivado
     */
	public String getCaminhoArquivoDerivado() {
		return super.getCaminhoArquivoDerivado();
	}
	
	/**
     * Define o caminho do arquivo que não é utilizado como base para o Merge de Arquivos 
     */
	public void setCaminhoArquivoDerivado(String caminhoArquivoDerivado) {
		this.caminhoArquivoDerivado = super.getCaminhoArquivoDerivado();
	} 
	
	/**
     * Retorna o nome do último método/algoritmo utilizado para realizar o Merge Automático 
     */
    public String getResultadoMergeAutomatico_BMS(){
    	return super.nomeAlgoritmoAutomatico;
    }    
    
    
	public void setExecutarMergeAutomatico() {
		//setMergeAutomatico_BMS();
		JOptionPane.showMessageDialog(null,"Entrou no BMS_Merge Manual.");
	}

	public void setExecutarMergeManual(String classe, String metodo) {
		//setMergeManual_BMS();
		JOptionPane.showMessageDialog(null,"Entrou no BMS_Merge Automático.");
	}

	/**
     * Define o nome do método/algoritmo que será utilizado para realizar o Merge Automático 
     * @param nomeAlgoritmo 
     */         
    public void setMergeAutomatico_BMS(){    	    	   
    	int linha = 0;	    	
    	int coluna = 0;
    	String[] vetorTokens;
    	String textoTextPane, tokenAtual;
    	String[][] matrizTxtpane1, matrizTxtpane2 = null;
    	posicaoSubstring = 0;
    	
    	//Preenchendo a matriz de conteúdo 1
    	linha = getLinhas(InterfacePrincipal.txtPane1);
    	coluna = getColunas(InterfacePrincipal.txtPane1);
    	matrizTxtpane1 = new String[linha][coluna];
    	
    	linha = 0; coluna = 0;
    	textoTextPane = InterfacePrincipal.txtPane1.getText();
    	
    	tokenAtual = getProximoToken(textoTextPane.length(),textoTextPane);
    	while(!tokenAtual.equals("")){
    		System.out.println(tokenAtual);
    		
    		
    		
    		
    		tokenAtual = getProximoToken(textoTextPane.length(),textoTextPane);	
    	}
    	
    	/*
    	for(int x=0; x<textoTextPane.length();x++){
    		System.out.println(textoTextPane.substring(x,x+1));
    		
    		tokenAtual = textoTextPane.substring(x,x+1);
    		
    		if(x>0){
    			tokenAnterior = textoTextPane.substring(x-1,x);
			}else{
				tokenAnterior="";
			}
    		
    		tokenPosterior = textoTextPane.substring(x+1,x+2);
    		
    		if(tokenAtual.equals("<")){
    			if((x>0) && (tokenAnterior.equals(">"))){	    			
    				linha++;  				    				
    				System.out.println("Linha:" + linha + "\n");
    			}else if(tokenPosterior.equals("/")){	    			
    					coluna++;
    					System.out.println("Coluna:" + coluna + "\n");
    					barraInvertida = true;    				
    			}
    			
    			if (!tokenAtual.equals(">")) System.out.println();
    			
    			if(!tokenAtual.equals(">")){
	    			while(!tokenAtual.equals(">")){	   
	    				tokenAtual = textoTextPane.substring(x,x+1);
	    				matrizTxtpane1[linha][coluna] = tokenAtual;	    				
	    				x++;	    				    				
	    				System.out.print(matrizTxtpane1[linha][coluna]);
	    			}
	    			tokenAtual = textoTextPane.substring(x,x+1);
	    			matrizTxtpane1[linha][coluna] = tokenAtual;
	    			x++;
	    			System.out.print(matrizTxtpane1[linha][coluna]);
	    			
	    			tokenAtual = textoTextPane.substring(x,x+1);
	    			if(!tokenAtual.equals("<")){ //se eh número ou letra,então é um texto...
	    				coluna++;
	    			}
    			}
    			
    			if(barraInvertida){
    				linha++;
    				System.out.println("Linha:" + linha + "\n");
				}
    		}else{
    			while(!tokenAtual.equals("<")){
    				tokenAtual = textoTextPane.substring(x,x+1);
    				matrizTxtpane1[linha][coluna] = tokenAtual;	    				
    				x++;	    				    				
    				System.out.print(matrizTxtpane1[linha][coluna]);
    				coluna++;
    			}    			
    		} 
    			    		    
    	}*/
    	
    	
    	
    	//Preenchendo a matriz de conteúdo 2
    	linha = getLinhas(InterfacePrincipal.txtPane2);
    	coluna = getColunas(InterfacePrincipal.txtPane2);
    	matrizTxtpane2 = new String[linha][coluna];
    	
    }
    
    private String getProximoToken( int tamanhoTexto, String texto){
    	boolean encontrouToken = false;
    	String token = "";
    	
    	token = texto.substring(posicaoSubstring,posicaoSubstring+1); //Pega o < ou então um caracter do texto
    	posicaoSubstring++;
    	
    	token = token + texto.substring(posicaoSubstring,posicaoSubstring+1); 
    	
    	if(!texto.substring(posicaoSubstring,posicaoSubstring+1).equals(">")){
	    	while(!texto.substring(posicaoSubstring,posicaoSubstring+1).equals("<") && !texto.substring(posicaoSubstring,posicaoSubstring+1).equals(">")){
	    		posicaoSubstring++;
	    		token = token + texto.substring(posicaoSubstring,posicaoSubstring+1); 
	    	}
    	}else{
    		token = token + texto.substring(posicaoSubstring,posicaoSubstring+1).equals(">");
    	}
    	posicaoSubstring++;
    	return token;
    }
    
    private int getLinhas(JTextPane txtPane){
    	String conteudo = null;
    	int linhas = 0;
    	boolean barraInvertida = false;
    	
    	//Definindo o número de linhas da matriz de conteúdo
    	conteudo = txtPane.getText();    	        	
    	//System.out.print("\nLinhas:");
    	for(int x=0; x<conteudo.length();x++){     		    		
    		if(conteudo.substring(x, x+1).equals("<")){
    			if(!conteudo.substring(x+1, x+2).equals("/")){    				
    				linhas++;    				
        			barraInvertida = false;
    			}else{
    				if(barraInvertida == false){
    					barraInvertida = true;
    				}else{	    				
	    				linhas++;	    				
    				}
    			}    	    		
			}
    	}        	    
    	//System.out.println(linhas);
    	return linhas;
    }
    
    private int getColunas(JTextPane txtPane){
    	String conteudo = null;
    	int colunas = 2;
    	
    	//Definindo o número de colunas da matriz de conteúdo
    	conteudo = txtPane.getText();
    	//System.out.print("\nColunas:");
    	for(int x=conteudo.length(); x>0;x--){    		
    		if(conteudo.substring(x-2, x-1).equals("<")){
    			if (conteudo.substring(x-1, x).equals("/")){
	    			colunas++;	    
    			}else{
    				x = 0; //flag de saída do for
    			}
    		}    		    	
    	}        
    	//System.out.println(colunas);
    	return colunas;    	    
    }
    
    /**
     * Retorna o nome do último método/algoritmo utilizado para realizar o Merge Manual 
     */
    public String getResultadoMergeManual_BMS(){
    	return super.nomeAlgoritmoManual;
    }
    
    /**
     * Define o nome do método/algoritmo que será utilizado para realizar o Merge Manual 
     */
    public void setMergeManual_BMS(){
    	JOptionPane.showMessageDialog(null, "Entrou no merge manual");
    }
}
